//
// Author: Vladimir Migashko <migashko@gmail.com>, (C) 2011
//
// Copyright: See COPYING file that comes with this distribution
//

#ifndef FASYS_FASYS_MESSAGE_INFO_HPP
#define FASYS_FASYS_MESSAGE_INFO_HPP

#include "types.hpp"
#include <iostream>

namespace fasys{

/** Сообщение хранимое в канале */
struct message_info
{
  /** INDEX. устанавлявается менеджером канала */
  message_id_t message_id;
  /** INDEX. устанавлявается менеджером канала */
  channel_id_t channel_id;
  /** INDEX. Порядок в канале. устанавлявается клиентом на свое усмотрение */
  order_t order;
  /** INDEX. Время регистрации. устанавлявается сервером в момент поступления события */
  time_t create_time;
  /** Время жизни. Устанавливается клиентом или сервером публикации*/
  time_t lifetime;
  /** INDEX. Время удаления события из канала. менеджером канала исходя их настроек канала*/
  time_t death_time;
  /** Ограничение на количество сообщений в канале. Устанавливается клиентом или сервером публикации*/
  size_t limit;
  /** контент сообщения. */
  mutable data_t* data;

  message_info()
    : message_id(0)
    , channel_id(0)
    , order(0)
    , create_time(0)
    , lifetime(0)
    , death_time(0)
    , limit(0)
    , data(0)
  {}

  message_info(channel_id_t channel_id, message_id_t message_id, time_t lifetime, order_t order, size_t limit)
    : message_id(message_id)
    , channel_id(channel_id)
    , order(order)
    , create_time(0)
    , lifetime(lifetime)
    , death_time(0)
    , limit(limit)
    , data(0)
  {
    time_t now = time(0);
    this->create_time = now;
    this->death_time = now + this->lifetime;
  }

  message_info(const message_info& mi)
    : message_id(mi.message_id)
    , channel_id(mi.channel_id)
    , order(mi.order)
    , create_time(mi.create_time)
    , lifetime(mi.lifetime)
    , death_time(mi.death_time)
    , limit(mi.limit)
    , data(mi.data)
  {
    mi.data = 0;
    std::cout << "message_info copy!"<< std::endl;
  }
 
  void operator = (const message_info& mi)
  {
    message_id = mi.message_id;
    channel_id = mi.channel_id;
    order = mi.order;
    create_time = mi.create_time;
    lifetime = mi.lifetime;
    death_time = mi.death_time;
    limit = mi.limit;
    data = mi.data;
    mi.data = 0;
    std::cout << "message_info ="<< std::endl;
  }


  virtual ~message_info()
  {
    delete data;
  }

  void create(channel_id_t channel_id, message_id_t message_id, time_t lifetime, order_t order, size_t limit)
  {
    time_t now = time(0);
    this->channel_id = channel_id;
    this->message_id = message_id;
    this->lifetime = lifetime;
    this->order = order;
    this->limit = limit;
    this->create_time = now;
    this->death_time = now + this->lifetime;
  }

  void attach( data_t* data )
  {
    this->data = data;
  }

  data_t* detach( )
  {
    data_t* result = this->data;
    this->data = 0;
    return result;
  }

  message_info clone() const
  {
    message_info mi;
    mi.message_id = message_id;
    mi.channel_id = channel_id;
    mi.order = order;
    mi.create_time = create_time;
    mi.lifetime = lifetime;
    mi.death_time = death_time;
    mi.limit = limit;
    mi.data = 0;
    if (data!=0)
    {
      mi.data = new data_t(*data);
      std::cout << "clone" << std::endl;
    }
    return mi;
  }

};

}

#endif

